/**
 * 
 */
package vo;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.AliasToBeanResultTransformer;

//import util.ConsProdutoTO;
import util.HibernateUtil;

/**
 * @author Saulo
 * 
 */
public class ProdutoDAO {

	// SALVAR PRODUTO
	public void salvarProduto(ProdutoVO produto) {

		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();
		if (produto.getIdProd() != 0) {
			session.update(produto);
		} else {
			session.save(produto);
			salvarProdutoEstoque(produto, session);
		}
		transaction.commit();

	}

	// SALVAR PRODUTO
	public void salvarProdutoEstoque(ProdutoVO produto, Session session) {
		ItemEstoqueDAO dao = new ItemEstoqueDAO();
		ItemEstoqueVO vo = new ItemEstoqueVO();

		vo.setProdutoIdProd(produto.getIdProd());
		vo.setQuantItEst(0);
		dao.salvarItemEstoqueZero(vo, session);

	}

	// EXCLUIR PRODUTO
	public void excluir(ProdutoVO produtoVO) {
		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		session.delete(produtoVO);

		transaction.commit();
	}

	// OBTER PRODUTO
	public ProdutoVO obter(Integer idProd) {
		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		Criteria criteria = session.createCriteria(ProdutoVO.class);
		criteria.add(Restrictions.eq("idProd", idProd));

		ProdutoVO produto = (ProdutoVO) criteria.uniqueResult();

		transaction.commit();

		return produto;
	}

	// CONSULTAR PRODUTO
	public List<ProdutoVO> consultarProdutosOld2(ProdutoVO produtoConsulta) {

		List<ProdutoVO> listaDeProdutos = new ArrayList<ProdutoVO>();

		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		Query query = session
				.createSQLQuery("select p.nome_prod, p.valor_prod, c.id_cor,"
						+ " t.id_med, m.id_mat from produto as p "
						+ "inner join cor c on c.id_cor = p.cor_id_cor"
						+ " inner join medida t on t.id_med = p.medida_id_med"
						+ " inner join material m on m.id_mat = p.material_id_mat");

		// + " WHERE C.NOME = :NOME");

		// query.setParameter("NOME", carroTO.getNome());

		query.setResultTransformer(new AliasToBeanResultTransformer(
				ProdutoVO.class));

		listaDeProdutos = query.list();
		transaction.commit();

		return listaDeProdutos;

	}

	public List<ProdutoVO> consultarProdutosOld(ProdutoVO produtoConsulta) {

		List<ProdutoVO> listaDeProdutos = new ArrayList<ProdutoVO>();

		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		Query query = session
				.createSQLQuery("select p.nome_prod, p.valor_prod, c.id_cor,"
						+ " t.id_med, m.id_mat from produto as p "
						+ "inner join cor c on c.id_cor = p.cor_id_cor"
						+ " inner join medida t on t.id_med = p.medida_id_med"
						+ " inner join material m on m.id_mat = p.material_id_mat");

		// + " WHERE C.NOME = :NOME");

		// query.setParameter("NOME", carroTO.getNome());

		query.setResultTransformer(new AliasToBeanResultTransformer(
				ProdutoVO.class));

		listaDeProdutos = query.list();
		transaction.commit();

		return listaDeProdutos;

	}

	@SuppressWarnings({ "unused" })
	public ProdutoVO consultarProdutoPorId(int id, Session session) {
		ProdutoVO produto = new ProdutoVO();

		Criteria criteria = session.createCriteria(ProdutoVO.class).add(
				Restrictions.eq("idProd", id));

		produto = (ProdutoVO) criteria.uniqueResult();

		// BUSCA COR DO PRODUTO
		CorDAO daoCor = new CorDAO();
		produto.setCorVO(daoCor.consultarCorPorId(produto.getCorIdCor(),
				session));

		// BUSCA MATERIAL DO PRODUTO
		MaterialDAO daoMaterial = new MaterialDAO();
		produto.setMaterialVO(daoMaterial.consultarMaterialPorID(
				produto.getMaterialIdMat(), session));

		// BUSCA MEDIDA DO PRODUTO
		MedidaDAO daoMedida = new MedidaDAO();
		produto.setMedidaVO(daoMedida.consultarMedidaPorID(
				produto.getMedidaIdMed(), session));

		return produto;
	}

	@SuppressWarnings("unchecked")
	public List<ProdutoVO> consultarProdutos(ProdutoVO produtoVO) {

		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		Criteria criteria = session.createCriteria(ProdutoVO.class);
		criteria.add(Restrictions.like("nomeProd", produtoVO.getNomeProd()+ "%"));
		List<ProdutoVO> produtos = criteria.list();
		
		List<ProdutoVO> listaAuxiliar = new ArrayList<ProdutoVO>();
		ProdutoVO produtoAuxiliar = new ProdutoVO();

		for (ProdutoVO vo : produtos) {
			vo = consultarProdutoPorId(vo.getIdProd(), session);
			produtoAuxiliar = vo;
			listaAuxiliar.add(produtoAuxiliar);
			produtoAuxiliar = new ProdutoVO();

		}
		transaction.commit();

		return listaAuxiliar;
	}

	public List<ProdutoVO> consultaPopUp(String consProd, String pesquisaProd) {

		Transaction transaction = null;

		Session session = HibernateUtil.currentSession();
		transaction = session.beginTransaction();

		Criteria criteria = session.createCriteria(ProdutoVO.class);
		// criteria.add(Restrictions.eq("nomeProd", consProd));

		List<ProdutoVO> produtos = criteria.list();
		transaction.commit();

		return produtos;
	}

	// public List<ConsProdutoTO> consultarProdutosTo(
	// ConsProdutoTO produtoConsultaTo) {
	// List<ConsProdutoTO> listaDeProdutosTo = new ArrayList<ConsProdutoTO>();
	//
	// Transaction transaction = null;
	//
	// Session session = HibernateUtil.currentSession();
	// transaction = session.beginTransaction();
	//
	// Query query = session
	// .createSQLQuery("select p.nome_prod as nomeProd, p.valor_prod as valorProd, c.id_cor as corIdCor, "
	// +
	// " t.id_med as medidaIdMed, m.id_mat as materialIdMat from produto as p "
	// + "inner join cor c on c.id_cor = p.cor_id_cor"
	// + " inner join medida t on t.id_med = p.medida_id_med"
	// + " inner join material m on m.id_mat = p.material_id_mat");
	//
	// // + " WHERE C.NOME = :NOME");
	//
	// // query.setParameter("NOME", carroTO.getNome());
	//
	// query.setResultTransformer(new AliasToBeanResultTransformer(
	// ConsProdutoTO.class));
	//
	// listaDeProdutosTo = query.list();
	// transaction.commit();
	//
	// return listaDeProdutosTo;
	// }

}
